package com.sys.app.entity.tag;


import com.alibaba.druid.util.StringUtils;
import org.springframework.context.ApplicationContext;
import org.thymeleaf.context.ITemplateContext;
import org.thymeleaf.model.IModel;
import org.thymeleaf.model.IModelFactory;
import org.thymeleaf.model.IProcessableElementTag;
import org.thymeleaf.processor.element.AbstractElementTagProcessor;
import org.thymeleaf.processor.element.IElementTagStructureHandler;
import org.thymeleaf.spring5.context.SpringContextUtils;
import org.thymeleaf.templatemode.TemplateMode;

/**
 * 控件：下拉框
 */
public class easyUIComBox extends AbstractElementTagProcessor {
    // 标签名
    private static final String TAG_NAME = "select";

    // 优先级
    private static final int PRECEDENCE = 10001;


    /*
   templateMode: 模板模式，这里使用HTML模板。
   dialectPrefix: 标签前缀。即xxx:text中的xxx。
   elementName：匹配标签元素名。举例来说如果是div，则我们的自定义标签只能用在div标签中。为null能够匹配所有的标签。
   prefixElementName: 标签名是否要求前缀。
   attributeName: 自定义标签属性名。这里为text。
   prefixAttributeName：属性名是否要求前缀，如果为true，Thymeeleaf会要求使用text属性时必须加上前缀，即xxx:text。
   precedence：标签处理的优先级，此处使用和Thymeleaf标准方言相同的优先级。
   removeAttribute：标签处理后是否移除自定义属性。
   */
    public easyUIComBox(String dialectPrefix) {
        super(
                // 模板类型为HTML
                TemplateMode.HTML,
                // 标签方言前缀
                dialectPrefix,
                // 标签名称
                TAG_NAME,
                // 将标签前缀应用于标签名称
                true,
                // 无属性名称：将通过标签名称匹配
                null,
                // 没有要应用于属性名称的前缀
                false,
                // 优先级
                PRECEDENCE
        );
    }
    /**
     * 处理自定义标签 DOM 结构
     *
     * @param iTemplateContext            模板页上下文
     * @param iProcessableElementTag      待处理标签
     * @param iElementTagStructureHandler 元素标签结构处理器
     */
    @Override
    protected void doProcess(ITemplateContext iTemplateContext, IProcessableElementTag iProcessableElementTag, IElementTagStructureHandler iElementTagStructureHandler) {
        // 获取 Spring 上下文
       // ApplicationContext applicationContext = SpringContextUtils.getApplicationContext(iTemplateContext);
        // 获取注入bean工厂
        //AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
        // 获取所需的bean，一般情况下这里我们直接使用Jdbc来操作数据库，因为它是一个公共组件，数据源不确定，所以要使用动态sql
        //JdbcOperations jdbcOperations = autowireCapableBeanFactory.getBean(JdbcOperations.class);
        //name属性
        String name = iProcessableElementTag.getAttributeValue("name");
        //type属性
        String vtype = iProcessableElementTag.getAttributeValue("vtype");
        //是否必填
        String required=iProcessableElementTag.getAttributeValue("required");
        required = StringUtils.isEmpty(required) ? "false" : required;
        //是否只读
        String readonly=iProcessableElementTag.getAttributeValue("readonly");
        readonly = StringUtils.isEmpty(readonly) ? "false" : readonly;
        //显示文字
        String label=iProcessableElementTag.getAttributeValue("label");
        //默认值
        String value = iProcessableElementTag.getAttributeValue("value");
        if (StringUtils.isEmpty(value) || "null".equals(value)) {
            value = "";
        }
        //dataSource 下拉框数据
        String dataSource = iProcessableElementTag.getAttributeValue("dataSource");
        if (StringUtils.isEmpty(dataSource)||"null".equals(dataSource)) {
            dataSource ="[]";
        }
        //url 下拉框数据
        String url = iProcessableElementTag.getAttributeValue("url");
        if (StringUtils.isEmpty(url)) {
            url ="";
        }
        //textField
        String textField = iProcessableElementTag.getAttributeValue("textField");
        if (StringUtils.isEmpty(textField)) {
            textField ="label";
        }
        //valueField
        String valueField = iProcessableElementTag.getAttributeValue("valueField");
        if (StringUtils.isEmpty(valueField)) {
            valueField ="value";
        }

        //几行展示
        //width= col-md-6 col-sm-12 二行显示
        //width="col-md-10" 一行显示
        String width = iProcessableElementTag.getAttributeValue("width");
        width = StringUtils.isEmpty(width) ? "col-md-6 col-sm-12" : width;

        StringBuffer result = new StringBuffer();
        result.append("<div ");
        result.append("class=\"").append(String.format("%s %s","form-group",width)).append("\" ");
        result.append(">");
        result.append("<div class=\"row\">");

        result.append("<label ");
        result.append("for=\"").append(name).append("\" ");
        result.append("class=\"col-sm-5 col-md-4 control-label text-right\"");
        result.append(">");
        if("true".equals(required.toLowerCase())) {
            result.append("<b>*</b>");
        }
        result.append(label);
        result.append("</label>");

        result.append("<div class=\"col-sm-7 col-md-8\">");
        //控件开始
        result.append("<input ");
        result.append("id=\"").append(name.replace(".","_")).append("\" ");
        result.append("name=\"").append(name).append("\" ");
        result.append("value=\"").append(value).append("\" ");
        //下拉框
        if("combox".equals(vtype)) {
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-combobox")).append("\" ");
        }
        //下拉树
        if("comtree".equals(vtype)) {
            result.append("class=\"").append(String.format("%s %s", "form-control", "easyui-combotree")).append("\" ");
        }
        if("true".equals(readonly.toLowerCase())) {
            result.append("readonly=\"").append(readonly).append("\" ");
        }
        result.append("required=\"").append(required).append("\" ");
        result.append("style=\"").append("width:100%").append("\" ");
        if(!"[]".equals(dataSource)) {
            result.append("data-options=\"").append(String.format("valueField:'%s',textField:'%s',data:%s", valueField, textField, dataSource)).append("\" ");
        }
        if(!"".equals(url)) {
            result.append("data-options=\"").append(String.format("valueField:'%s',textField:'%s',url:'%s'", valueField, textField, url)).append("\" ");
        }
        result.append("/>");
        //控件结束

        result.append("</div>");

        result.append("</div>");
        result.append("</div>");
        // 创建将替换自定义标签的 DOM 结构
        IModelFactory modelFactory = iTemplateContext.getModelFactory();
        IModel model = modelFactory.createModel();
        // 这里是将字典的内容拼装成HTML
        model.add(modelFactory.createText(result));
        // 利用引擎替换整合标签
        iElementTagStructureHandler.replaceWith(model, false);
    }
}
